package gdf

import (
	"gitee.com/liumou_site/logger"
	"os"
	"strconv"
)

// DownloadThreadController的downloads方法负责管理多线程下载的逻辑。
// 它接受一个参数oneThreadDownloadSize，表示每个线程尝试下载的文件大小。
// 该方法返回一个布尔值，表示下载是否成功。
func (controller *DownloadThreadController) downloads(oneThreadDownloadSize int) bool {
	// 尝试解析目标文件，获取必要的下载信息。
	logger.Debug("Try to parse the object file...")
	length, rangeMaps, tempFilenames, contentType, err := TestDownload(controller.FileUrl, oneThreadDownloadSize)

	// 记录文件的总大小，方便后续的监控和调试。
	logger.Debug("File total size -> " + strconv.FormatFloat(float64(length)/(1024.0*1024.0), 'f', 2, 64) + "M")
	if err != nil {
		// 如果出现错误，记录错误信息并返回失败状态。
		logger.Error("The file does not support multi-threaded download.")
		return false
	}

	// 记录解析文件成功的日志，并初始化下载控制器。
	logger.Info("Parse the target file successfully, start downloading the target file...")
	controller.Init() // 初始化通道、分片等配置
	// 调整单线程下载大小。
	oneThreadDownloadSize = 1024 * 1024 * 4 // 1024字节 = 1024bite = 1kb -> 4M

	// 构建最终文件名列表。
	var filenames []string
	for _, value := range tempFilenames {
		filenames = append(filenames, controller.DownloadFolder+"/"+value)
	}

	// 根据内容类型获取文件后缀。
	fileSuffix := controller.getSuffix(contentType)
	filename := controller.DownloadFileName // 获取文件下载名
	controller.Filenames = filenames        //下载文件的切片列表
	controller.RangeStrs = rangeMaps        // 下载文件的Range范围

	// 启动下载线程。
	go controller.Run() // 开始下载文件

	// 处理下载结果。
	processResult := controller.resultProcess(len(rangeMaps))
	downloadResult := false // 定义下载结果标记
	logger.Debug(processResult)
	if processResult == "SUCCESSES" {
		// 如果下载成功，尝试合并文件并重命名。
		absoluteFilename := controller.DownloadFolder + "/" + filename + "." + fileSuffix
		downloadResult = controller.combineFiles(filename + "." + fileSuffix)
		if downloadResult {
			newSuffix := getFileType(GetBytesFile(absoluteFilename, 10))
			err = os.Rename(absoluteFilename, controller.DownloadFolder+"/"+filename+"."+newSuffix)
			if err != nil {
				// 如果重命名失败，记录日志但标记为下载成功。
				downloadResult = true
				logger.Info("Combine file successes, Rename file failed " + absoluteFilename)
			} else {
				// 如果重命名成功，记录日志。
				logger.Info("Combine file successes, processResult, new file name is -> " + controller.DownloadFolder + "/" + filename + "." + newSuffix)
			}
		} else {
			// 如果合并文件失败，记录错误日志。
			logger.Error("Failed to download file.")
		}
	} else {
		// 如果下载失败，记录错误日志并输出失败原因。
		logger.Error("Failed to download file. Reason -> " + processResult)
		// 打印url
		logger.Debug(controller.FileUrl)
	}
	// 返回下载结果。
	return downloadResult
}
